break;
case INSTR_CMP:
+ case INSTR_SUB:
if (src & REGISTER) {
index = operand_index(src);
value = get_reg_value(size, index, 0, regs);
index = operand_index(dst);
value = get_reg_value(size, index, 0, regs);
diff = value - (unsigned long) p->u.data;
+ if ( mmio_opp->instr == INSTR_SUB )
+ set_reg_value(size, index, 0, regs, diff);
}
/*
GET_OP_SIZE_FOR_NONEBYTE(instr->op_size);
return mem_reg(instr->op_size, opcode, instr, rex);
+ case 0x2B: /* sub m32/16, r32/16 */
+ instr->instr = INSTR_SUB;
+ GET_OP_SIZE_FOR_NONEBYTE(instr->op_size);
+ return mem_reg(instr->op_size, opcode, instr, rex);
+
case 0x30: /* xor r8, m8 */
instr->instr = INSTR_XOR;
instr->op_size = BYTE;
case INSTR_CMP: /* Pass through */
case INSTR_TEST:
+ case INSTR_SUB:
mmio_opp->flags = mmio_inst.flags;
mmio_opp->instr = mmio_inst.instr;
mmio_opp->operand[0] = mmio_inst.operand[0]; /* source */